package com.gxa.hualianeshop.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxa.hualianeshop.component.ActiveMQProducer;
import com.gxa.hualianeshop.entity.pojo.Role;
import com.gxa.hualianeshop.entity.pojo.Spu;
import com.gxa.hualianeshop.mapper.RoleMapper;
import com.gxa.hualianeshop.mapper.SpuMapper;
import com.gxa.hualianeshop.service.RoleService;
import com.gxa.hualianeshop.service.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author gxa
 * @since 2023-07-05
 */
@Service
public class SpuServiceImpl extends ServiceImpl<SpuMapper, Spu> implements SpuService {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Override
    public Spu getCacheById(Long id) {

        // 判断缓存中是否存在

        // 存在就直接通过缓存获取

        // 如果不存在, 就从数据库获取
        //问题1: 如果缓存中没有, 就会直接访问数据库 导致缓存的击穿

        // 所以, 生成一个分布式锁(setNX)   / Redisson第三方加锁 lock()
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("goodsCachelock", "lock", 10, TimeUnit.SECONDS);
        if(aBoolean){
            // 在读取数据库-> 缓存在redis

            // 释放锁

        }

        // 问题2: 如果缓存中没有, 用户请求 -1 数据库不存在的,
        // 就给用户生成一个临时的缓存
       // goods:-1  null

        // 问题3: 如果缓存中商品同时过期, 请求会集中到数据库,造成雪崩


        Spu byId = this.getById(id);
        return null;
    }

    @Autowired
    ActiveMQProducer activeMQProducer;

    @Override
    public void updateAndDeleteCache(Spu spu) {
        // 修改数据库
        //updateById(spu);

        // 把商品的id 生产到消息队列中
        activeMQProducer.sendTextMessage("goodsCacheId",spu.getId().toString());
    }
}
